using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;

namespace Admin.RazorLib
{
    // This class provides an example of how JavaScript functionality can be wrapped
// in a .NET class for easy consumption. The associated JavaScript module is
// loaded on demand when first needed.
//
// This class can be registered as scoped DI service and then injected into Blazor
// components for use.

    public class ExampleJsInterop : IAsyncDisposable
    {
        private readonly Lazy<Task<IJSObjectReference>> moduleTask;

        public ExampleJsInterop(IJSRuntime jsRuntime)
        {
            moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
                "import", "./_content/Admin.RazorLib/exampleJsInterop.js").AsTask());
        }

        public async ValueTask SyncPopupWidth(ElementReference popupElement, ElementReference textBoxElement)
        {
            var module = await moduleTask.Value;
            await module.InvokeVoidAsync("syncPopupWidth", popupElement, textBoxElement);
        }

        public async ValueTask<string> Prompt(string message)
        {
            var module = await moduleTask.Value;
            return await module.InvokeAsync<string>("showPrompt", message);
        }

        public async ValueTask DisposeAsync()
        {
            if (moduleTask.IsValueCreated)
            {
                var module = await moduleTask.Value;
                await module.DisposeAsync();
            }
        }

        public async Task DownloadFileFromStream(Stream fileStream, string fileName)
        {
            using var streamRef = new DotNetStreamReference(stream: fileStream);
            var module = await moduleTask.Value;
            await module.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
        }
    }
}